#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
    pid_t id = fork();
    if(id==0)
    {
        //child
        printf("start exec.....\n");
        execl("/usr/bin/ls", "ls", "-l", "-a", NULL);
        printf("exec after....\n");
        sleep(3);
        exit(0);
    }
    //father
    pid_t ret = wait(NULL);
    printf("wait success...\n");
    sleep(3);
    return 0;
}

//int main()
//{
//    pid_t id = fork();
//    if(id==0)
//    {
//        //child
//        int cnt = 3;
//        while(cnt)
//        {
//            printf(" child doing somethings PID:%d\n", getpid());
//            sleep(3);
//            cnt--;
//        }
//        exit(0);
//    }
//    //father 
//    while(1)
//    {
//        int status = 0;
//        pid_t ret = waitpid(id, &status, WNOHANG);  //非阻塞等待
//        if(ret > 0)
//        {
//            printf("wait success PID:%d\n", id);
//            if(WIFEXITED(status))
//            {
//                printf("exit code:%d\n", WEXITSTATUS(status));
//                break;
//            }
//        }
//        else if(ret == 0)
//        {
//            printf("father doing some other...\n");
//            sleep(1);
//        }
//        else{
//            //wait fail
//            printf("waitpid error\n");
//            break;
//        }
//    }
//    return 0;
//}
////int main()
//{
//    pid_t ids[10];
//    for(int i = 0;i<10;i++)
//    {
//        pid_t id = fork();
//        if(id==0)
//        {
//            //child
//            printf("I am a child process...PId:%d,PPId:%d\n", getpid(), getppid());
//            sleep(3);
//            exit(i); //退出码为对应子进程在数组中对应位置的下标
//        }
//        //parent
//        ids[i] = id;
//    }
//    for(int i = 0;i<10;i++)
//    {
//        int status = 0;
//        pid_t ret = waitpid(ids[i], &status, 0); //阻塞等待
//        if(ret>0)
//        {
//            printf("wait success PID:%d\n", ids[i]);
//            if(WIFEXITED(status))   
//            {
//                printf("exit code:%d\n", WEXITSTATUS(status));
//            }   
//            else{
//                //signal killed
//                printf("exit signal:%d\n", status&0x7F);
//            }
//        }
//        sleep(3);
//    }
//    return 0;
//}
//


//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        //child
//        int cnt = 10;
//        while(cnt--)
//        {
//            printf("I am child...PID:%d, PPID:%d\n", getpid(),getppid());
//            sleep(1);
//        }
//        exit(0);
//    }
//    //father
//    int status = 0;
//    pid_t ret = wait(&status);  //阻塞等待
//    if(ret > 0)
//    {
//        //wait success
//        printf("wait child success...\n");
//        if(WIFEXITED(status))
//        {
//            //exit normal
//            printf("exit code:%d\n", WEXITSTATUS(status));
//        }
//    }
//    sleep(3);
//    return 0;
//}
//

    //exitCode = (status >> 8) & 0xFF; //退出码
    //exitSignal = status & 0x7F; //退出信号
//void show()
//{
//    printf("hello world");
//    exit(2);
//}
//int main()
//{
//    show();
//    return 0;
//}
//#include<string.h>
//int main()
//{
//    printf("hello world\n");
//    return 0;
//}
//int main()
//{
//    for(int i = 0;i<150;i++)
//    {
//        printf("%d:%s\n", i, strerror(i));
//    }
//    return 0;
//}

//int main()
//{
//    printf("fork before:PID is %d\n", getpid());
//    pid_t id = fork();
//    if(id==-1)
//    {
//  j      printf("fork error!\n");
//        exit(1);
//    }
//    printf("fork after:PID is %d, return is %d\n", getpid(), id);
//    sleep(1);
//    return 0;
//}
